import java.util.*;
import java.util.regex.Pattern;

/**
 * 测试Java层面的专业名称匹配逻辑
 */
public class JavaMajorNameMatchingTest {
    
    // 去除专业名称中括号及其内容的正则表达式
    private static final Pattern MAJOR_NAME_PATTERN = Pattern.compile("\\([^)]*\\)");
    
    /**
     * 去除专业名称中的括号及其内容
     */
    public static String removeBrackets(String majorName) {
        if (majorName != null && !majorName.trim().isEmpty()) {
            return MAJOR_NAME_PATTERN.matcher(majorName).replaceAll("").trim();
        }
        return majorName;
    }
    
    /**
     * 提取专业名称中括号内的所有专业名称
     */
    public static List<String> extractMajorNamesFromBrackets(String majorName) {
        List<String> result = new ArrayList<>();
        
        if (majorName == null || majorName.trim().isEmpty()) {
            return result;
        }
        
        int startIndex = majorName.indexOf('(');
        int endIndex = majorName.lastIndexOf(')');
        
        if (startIndex > 0 && endIndex > startIndex) {
            String bracketContent = majorName.substring(startIndex + 1, endIndex);
            
            // 按照中文顿号、逗号等分隔符分割
            String[] parts = bracketContent.split("[、，,]");
            
            for (String part : parts) {
                String trimmed = part.trim();
                if (!trimmed.isEmpty()) {
                    result.add(trimmed);
                }
            }
        }
        
        return result;
    }
    
    /**
     * 判断两个专业名称是否匹配
     */
    public static boolean isMajorNameMatch(String dbMajorName, String inputMajorName) {
        if (dbMajorName == null || dbMajorName.trim().isEmpty() || 
            inputMajorName == null || inputMajorName.trim().isEmpty()) {
            return false;
        }
        
        // 1. 直接匹配
        if (dbMajorName.equals(inputMajorName)) {
            return true;
        }
        
        // 2. 包含匹配（双向）
        if (dbMajorName.contains(inputMajorName) || inputMajorName.contains(dbMajorName)) {
            return true;
        }
        
        // 3. 去括号匹配
        String dbCleanName = removeBrackets(dbMajorName);
        String inputCleanName = removeBrackets(inputMajorName);
        
        if (dbCleanName.equals(inputCleanName)) {
            return true;
        }
        
        // 4. 去括号后的包含匹配
        if (dbCleanName.contains(inputCleanName) || inputCleanName.contains(dbCleanName)) {
            return true;
        }
        
        // 5. 括号内容匹配：检查一个名称是否在另一个的括号内容中
        if (inputMajorName.contains("(") && inputMajorName.contains(")")) {
            // 输入包含括号，检查数据库名称是否在输入的括号内容中
            if (inputMajorName.contains(dbMajorName) || inputMajorName.contains(dbCleanName)) {
                return true;
            }
        }
        
        if (dbMajorName.contains("(") && dbMajorName.contains(")")) {
            // 数据库包含括号，检查输入名称是否在数据库的括号内容中
            if (dbMajorName.contains(inputMajorName) || dbMajorName.contains(inputCleanName)) {
                return true;
            }
        }
        
        // 6. 括号内具体专业匹配
        List<String> dbBracketNames = extractMajorNamesFromBrackets(dbMajorName);
        List<String> inputBracketNames = extractMajorNamesFromBrackets(inputMajorName);
        
        // 检查输入的去括号名称是否在数据库的括号内容中
        if (dbBracketNames.contains(inputCleanName)) {
            return true;
        }
        
        // 检查数据库的去括号名称是否在输入的括号内容中
        if (inputBracketNames.contains(dbCleanName)) {
            return true;
        }
        
        // 检查括号内容是否有交集
        for (String dbBracket : dbBracketNames) {
            if (inputBracketNames.contains(dbBracket)) {
                return true;
            }
        }
        
        return false;
    }
    
    /**
     * 测试专业名称匹配
     */
    public static void testMatch(String dbName, String inputName, boolean expected) {
        boolean result = isMajorNameMatch(dbName, inputName);
        String status = result == expected ? "✅ PASS" : "❌ FAIL";
        System.out.println(String.format("%s | DB: %-40s | Input: %-40s | Result: %s", 
            status, dbName, inputName, result));
    }
    
    public static void main(String[] args) {
        System.out.println("=== Java专业名称匹配测试 ===\n");
        
        System.out.println("1. 基本匹配测试:");
        testMatch("软件工程", "软件工程", true);
        testMatch("软件工程", "计算机科学与技术", false);
        
        System.out.println("\n2. 包含匹配测试:");
        testMatch("软件工程", "软件工程(计算机学院)", true);
        testMatch("软件工程(计算机学院)", "软件工程", true);
        
        System.out.println("\n3. 去括号匹配测试:");
        testMatch("康复治疗学", "康复治疗学(医学院，咸嘉湖校区)", true);
        testMatch("康复治疗学(医学院，咸嘉湖校区)", "康复治疗学", true);
        
        System.out.println("\n4. 括号内容匹配测试（重点）:");
        testMatch("软件工程", "计算机类(包含软件工程，计算机科学与技术等)", true);
        testMatch("计算机科学与技术", "计算机类(包含软件工程，计算机科学与技术等)", true);
        testMatch("网络工程", "计算机类(包含软件工程，计算机科学与技术等)", false);
        
        System.out.println("\n5. 复杂场景测试:");
        testMatch("软件工程", "计算机类(软件工程、计算机科学与技术)", true);
        testMatch("计算机科学与技术", "计算机类(软件工程、计算机科学与技术)", true);
        testMatch("数据科学与大数据技术", "计算机类(软件工程、计算机科学与技术)", false);
        
        System.out.println("\n6. 反向匹配测试:");
        testMatch("计算机类(软件工程、网络工程)", "软件工程", true);
        testMatch("计算机类(软件工程、网络工程)", "网络工程", true);
        testMatch("计算机类(软件工程、网络工程)", "电子信息工程", false);
        
        System.out.println("\n=== 性能对比分析 ===");
        
        // 模拟性能测试
        long startTime = System.currentTimeMillis();
        
        // 模拟1000次匹配操作
        for (int i = 0; i < 1000; i++) {
            isMajorNameMatch("软件工程", "计算机类(包含软件工程，计算机科学与技术等)");
            isMajorNameMatch("康复治疗学", "康复治疗学(医学院，咸嘉湖校区)");
            isMajorNameMatch("计算机科学与技术", "计算机类(软件工程、计算机科学与技术)");
        }
        
        long endTime = System.currentTimeMillis();
        System.out.println("Java匹配1000次耗时: " + (endTime - startTime) + "ms");
        
        System.out.println("\n=== 优势总结 ===");
        System.out.println("✅ 内存操作，速度快");
        System.out.println("✅ 逻辑清晰，易于维护");
        System.out.println("✅ 支持复杂匹配场景");
        System.out.println("✅ 减少SQL复杂度");
        System.out.println("✅ 避免数据库性能问题");
    }
}
